﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SIAD.Model
{
    /// <summary>
    /// Représente le plateau de jeu
    /// </summary>
    class Plateau
    {
        #region Properties
        /// <summary>
        /// Les Cases du tableau
        /// </summary>
        protected Case[,] theCases;

        protected int _length;
        public int Length { get { return _length; } }
        #endregion

        #region Constructor
        /// <summary>
        /// Cré le plateau de jeu
        /// </summary>
        /// <param name="taille">La taille du plateau en incluant les bords invisibles</param>
        public Plateau(int taille)
        {
            _length = taille;
            theCases = new Case[taille, taille];
            for (int i = 0; i < taille; ++i)
            {
                for (int j = 0; j < taille; ++j)
                {
                    Common.CASE_TYPE aCaseType = Common.CASE_TYPE.EMPTY;
                    if (i == 0 || j == 0 || i == taille - 1 || j == taille - 1)
                    {
                        aCaseType = Common.CASE_TYPE.BLOCK;
                    }
                    theCases[i, j] = new Case(aCaseType);
                }               
            }
        }
        #endregion

        #region Indexer
        /// <summary>
        /// Permet d'utiliser le plateau comme un tableau bidimensionnel.
        /// Tout en gardant l'information de sa taille par ligne et par colonne
        /// </summary>
        /// <param name="indexLigne">le numéro de la ligne voulue</param>
        /// <param name="indexColonne">le numéro de la colonne voulue</param>
        /// <returns>La case correspondante dans le tableau</returns>
        public Case this[int indexLigne, int indexColonne]
        {
            get
            {
                return theCases[indexLigne, indexColonne];
            }
            set
            {
                if (theCases[indexLigne, indexColonne] != value)
                {
                    theCases[indexLigne, indexColonne] = value;
                }
            }
        }
        #endregion

        #region Public Method

        /// <summary>
        /// Permet de trouver un player spécifier
        /// </summary>
        /// <param name="aPlayer">La case du player voulu</param>
        /// <returns>les coordonnés dans le plateau</returns>
        public Tuple<int, int> FindPlayer(Common.CASE_TYPE aPlayer)
        {
            if (aPlayer == Common.CASE_TYPE.PLAYER_ONE || aPlayer == Common.CASE_TYPE.PLAYER_TWO)
            {
                for (int i = 1; i < _length - 1; ++i)
                {
                    for (int j = 1; j < _length - 1; ++j)
                    {
                        if (theCases[i, j].theCaseType == aPlayer)
                        {
                            return new Tuple<int, int>(i, j);
                        }
                    }
                }
            }
            return null;
        }

        #endregion
    }
}
